// 加载环境变量
require('dotenv').config();

const Koa = require('koa');
const serve = require('koa-static');
const bodyparser = require('koa-bodyparser');
const { v4: uuidv4 } = require('uuid'); // 用于生成唯一的用户标识
const compress = require('koa-compress');

const moment = require('moment');
const path = require('path');
const fs = require('fs');
const app = new Koa();
const http = require('http');
const https = require('https');
const proxy = require('koa-proxies');

// 配置bodyparser中间件
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}));
// 中间件：检查是否存在 userId cookie，如果没有则生成一个新的，并设置到响应中
app.use(async (ctx, next) => {
  let userId = ctx.cookies.get('userId');
  if (!userId) {
    // 如果不存在 userId，则生成一个新的唯一ID
    userId = uuidv4();
    // 将 userId 存入 cookie 中
    ctx.cookies.set('userId', userId, {
      httpOnly: true,              // 防止客户端JavaScript访问，增强安全性
      // maxAge: 24 * 60 * 60 * 1000    // 设置 cookie 过期时间为 1 天（单位毫秒）
      expires: new Date('Fri, 31 Dec 9999 23:59:59 GMT')
      // 如果在生产环境，建议设置 secure:true（仅 HTTPS 传输）
    });
    console.log(moment().format("YYYY-MM-DD HH:mm:ss"), '新用户标识：', userId);
  } else {
    console.log(moment().format("YYYY-MM-DD HH:mm:ss"), '老用户标识：', userId);
  }
  await next();
});

// 请求日志中间件
app.use(async (ctx, next) => {
  console.log(
    'x-forwarded-for', ctx.req.headers['x-forwarded-for'],
    "\nreq.socket.remoteAddress", ctx.req.socket.remoteAddress + ":" + ctx.req.socket.remotePort
  );
  console.log("url::", ctx.url)
  console.log("query::", JSON.stringify(ctx.query), JSON.stringify(ctx.request.body),)
  Object.keys(ctx.request.headers).forEach(key => {
    console.log(key, ctx.request.headers[key]);
  })

  console.log("---------------------")
  await next();
});

// 从环境变量获取静态文件目录，默认为./public
const staticPath = process.env.STATIC_PATH || './public';

// 使用koa-static中间件公开静态页面
app.use(compress({
  threshold: 1024, // 只有大于 1KB 的响应才会被压缩
  flush: require('zlib').Z_SYNC_FLUSH // 兼容性设置
}));

app.use(async (ctx, next) => {
  if (ctx.hostname == "m.deeplove.site" || ctx.hostname == "seek.deeplove.site") {
    console.log([ctx.path, ctx.search]);
    ctx.redirect("https://www.deepseek.com" + ctx.url);
  } else if (ctx.hostname == "manus.deeplove.site") {
    ctx.redirect("https://www.manus.im" + ctx.url);
  } else if (ctx.host === 'tieba.deeplove.site') {
    return proxy('/', {
      target: 'http://127.0.0.1:4567',
      changeOrigin: true, // 修改 Host 请求头
      secure: false, // 如果目标使用自签名证书，需设置为 false
      logs: true, // 开启代理日志，方便调试
    })(ctx, next);
  }else if (ctx.host === 'shudu.deeplove.site') {
    return proxy('/', {
      target: 'http://127.0.0.1:8001',
      changeOrigin: true, // 修改 Host 请求头
      secure: false, // 如果目标使用自签名证书，需设置为 false
      logs: true, // 开启代理日志，方便调试
    })(ctx, next);
  }else if (ctx.host === 'page.deeplove.site') {
    return proxy('/', {
      target: 'http://127.0.0.1:8002',
      changeOrigin: true, // 修改 Host 请求头
      secure: false, // 如果目标使用自签名证书，需设置为 false
      logs: true, // 开启代理日志，方便调试
    })(ctx, next);
  }  else {
    await next();
  }
})
// 读取环境变量，设置静态资源目录

// 公开静态资源
app.use(serve(staticPath, {
  gzip: true, // 允许直接提供 .gz 资源
  brotli: true, // 允许直接提供 .br 资源（更高压缩比）
  maxage: 60 * 60 * 24 * 7 * 1000 // 设置缓存时间（7 天）
}));
let keyPath = path.resolve(__dirname, './cert/key.pem');
let certPath = path.resolve(__dirname, './cert/cert.pem');


if (fs.existsSync(keyPath) && fs.existsSync(certPath)) {
  console.log(keyPath, certPath);
  var options = {
    key: fs.readFileSync(keyPath),
    cert: fs.readFileSync(certPath),
  };
}


// 启动服务器，端口号从环境变量获取或默认为3000
const port = process.env.PORT || 3000;
// app.listen(port);
// HTTP 服务器
http.createServer(app.callback()).listen(80, () => {
  console.log('HTTP server running at http://localhost:80');
});



// HTTPS 服务器
if (options)
  https.createServer(options, app.callback()).listen(443, () => {
    console.log('HTTPS server running at https://localhost:443');
  });
console.log(`app started at port ${port}...`);